package com_.dxy_test_.file_copy_;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * @Description 文件复制
 * @Author dangxianyue
 * @Date 2022/10/28 9:16
 */
public class FileCopyTest {

    public static void main(String[] args) {
        copyDir("D:\\JavaProject\\demo\\yonghe", "C:\\Users\\Alex\\Desktop\\new");
    }

    /**
     * 复制文件夹
     *
     * @param oldDir 原来的目录
     * @param newDir 复制到哪个目录
     */
    public static void copyDir(String oldDir, String newDir) {
        File srcDir = new File(oldDir);
        // 判断文件是否不存在或是否不是文件夹
        if (!srcDir.exists() || !srcDir.isDirectory()) {
            throw new IllegalArgumentException("参数错误");
        }
        File destDir = new File(newDir);
        if (!destDir.exists()) {
            // 不存在就创建目录
            destDir.mkdirs();
        }

        // 列出目录中的文件
        File[] files = srcDir.listFiles();
        for (File f : files) {
            // 是文件就调用复制文件方法 是目录就继续调用复制目录方法
            if (f.isFile()) {
                if (f.getName().endsWith(".log") ||
                        f.getName().endsWith(".log.gz") ||
                        f.getName().endsWith(".class") ||
                        f.getName().endsWith(".iml")) {
                    continue;
                }
                String newFileName = f.getName();
                if (newFileName.endsWith(".java")) {
                    newFileName = newFileName + "txt";
                }
                copyFile(f, new File(newDir, newFileName));
                System.out.println("文件【" + f.getName() + "】复制完成！");
            } else if (f.isDirectory()) {
                if (f.getName().endsWith("idea") ||
                        f.getName().endsWith("git") ||
                        f.getName().endsWith("target") ||
                        f.getName().endsWith("mvn")) {
                    continue;
                }
                copyDir(oldDir + File.separator + f.getName(),
                        newDir + File.separator + f.getName());
                System.out.println("文件夹【" + f.getName() + "】复制完成！");
            }
        }
    }


    /**
     * 复制文件
     *
     * @param oldDir 原来的文件
     * @param newDir 复制到的文件
     */
    public static void copyFile(File oldDir, File newDir) {
        BufferedInputStream bufferedInputStream = null;
        BufferedOutputStream bufferedOutputStream = null;
        byte[] b = new byte[1024];
        try {
            // 将要复制文件输入到缓冲输入流
            bufferedInputStream = new BufferedInputStream(new FileInputStream(oldDir));
            // 将复制的文件定义为缓冲输出流
            bufferedOutputStream = new BufferedOutputStream(new FileOutputStream(newDir));
            // 定义字节数
            int len;
            while ((len = bufferedInputStream.read(b)) > -1) {
                // 写入文件
                bufferedOutputStream.write(b, 0, len);
            }
            //刷新此缓冲输出流
            bufferedOutputStream.flush();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (bufferedInputStream != null) {
                try {
                    // 关闭流
                    bufferedInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (bufferedOutputStream != null) {
                try {
                    bufferedOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

}
